iT邦幫忙

2023 iThome 鐵人賽

DAY 25
1

Ruby 是一款物件導向程式語言(Objecte-Oriented Programming, OOP),也就是說在 Ruby 裡,幾乎所有的東西都是物件。

物件與類別

  • 物件(Objects):
    物件有兩個主要特性:狀態(state)和行為(behavior)。狀態是指物件的屬性或數據,而行為是指物件可以執行的方法或函數。

  • 類別(Classes):
    類別是用來定義物件的模板或藍圖。你可以將類別視為一個定義了物件屬性和方法的模型。
    類別是用 class 關鍵字來定義的,例如:

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end

  def greet
    puts "Hello, my name is #{@name} and I'm #{@age} years old."
  end
end

類別跟物件的關係,就像是章魚燒烤盤跟章魚燒一樣,烤盤就是類別(class),負責定義出章魚燒要有哪些東西,而章魚燒就是實體(Instance),一樣形狀的模具,放一樣的原料進去,做出來的章魚燒應該都會長得一樣。

物件屬性

由於 Ruby 裡面並沒有屬性(attribute)這樣的設計,要取用實體變數,需要另外定義的方法才行:

class Customer

  def initialize(id, name)
    @id = id
    @name = name
  end

# 建立取得 instance variable 的方法
# 方法的名稱通常會和arguments, 實例變數一樣。
  def id
    @id
  end

  def name
    @name
  end
end

那不是代表每次寫class的時候我都要寫這麼一長串? 因此Ruby有一個方法可以利用,就是setter/getter

setter/getter: 取得或設定 class 中的 instance variable

  • 如果沒有使用attr_reader的情況

    class Customer
    
      def initialize(id, name)
        @id = id
        @name = name
      end
    
    # 建立取得 instance variable 的方法
    # 方法的名稱通常會和arguments, 實例變數一樣。
      def id
        @id
      end
    
      def name
        @name
      end
    end
    
    aaron = Customer.new(1, "Aaron", "Tainan")
    
    p aaron.id  #1                             
    p aaron.name # "Aaron"
    
  • 使用 attr_reader的情況

    class Customer
    
      attr_reader :id, :name
      def initialize(id, name)
        @id = id
        @name = name
      end
    
    aaron = Customer.new(1, "Aaron", "Tainan")
    
    p aaron.id  #1                             
    p aaron.name # "Aaron"
    

可以看到有了attr_reader之後,可以少寫了很多用來定義屬性的方法,並且整個城市馬也乾淨了許多。

但由於attr_reader只有讀取屬性,如果要更改屬性的內容的話我們還需要使用attr_setter

  • 沒有使用attr_setter的情況

    class Customer
      attr_reader :id, :name, :addr
    
      def initialize(id, name, addr)
        @id = id
        @name = name
        @addr = addr
      end
    
      # 更改/設定 instance variable 的方法
      def id=(value)
        @id = value
      end
    
      def name=(value)
        @name = value
      end
    
      def addr=(value)
        @addr = value
      end
     end
     aaron = Customer.new(1, "Aaron", "Tainan")
     p aaron.id      # 1
    
     aaron.id = 2    # 重新設定實例變數
     p aaron.id      # 2
    
  • 使用 attr_writer

    class Customer
      attr_reader :id, :name, :addr  #快速取得 instance variable
      attr_writer :id, :name, :addr  #快速設定 instance variable
    
      def initialize(id, name, addr)
        @id = id
        @name = name
        @addr = addr
      end
    
    end
    
    aaron = Customer.new(1, "Aaron", "Tainan")
    p aaron.id      # 1
    
    aaron.id = 2    # 重新設定實例變數
    p aaron.id      # 2
    
  • attr_accessor:同時建立 setter 和 getter

    class Customer
    
      attr_accessor :id, :name, :addr    # 等於同時寫了 attr_reade 和 attr_writer
      def initialize(id, name, addr)
        @id = id
        @name = name
        @addr = addr
      end
    
    end
    

參考資料:
https://pjchender.dev/ruby-on-rails/ruby-object/
https://railsbook.tw/chapters/08-ruby-basic-4


上一篇
[Day 24] Ruby : 雜湊(Hash) 與 符號(Symbol)
下一篇
[Day 26] Ruby: 模組
系列文
30天從零到有,帶你進入程式的世界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言